﻿/*
 *@desc: 解析南瑞继保103报文
 * 完整报文有apci 和 asdu 两部分，有些报文会多个个报文包一起连着发过来
 * 1.分离apci和asdu
 * 2.将 asdu 数据传给 asdu 解析层
 * 3.当读定值组的时候，由于数据时分成几个asdu传过来的，逐个提取出信息存到一个统一的list中
*/

#ifndef SF103_PARSER_H
#define SF103_PARSER_H
#include <QObject>
#include <QByteArray>
#include <QList>
#include <QThread>
#include "SFAsduParser.h"
#include "SF/SF103_Type.h"

class SF103_Parser : public QThread
{
    Q_OBJECT

public:
    SF103_Parser() {}

    virtual ~SF103_Parser() {}

    //对外接口, 完整报文 分割为 apci和asdu 列表
    void parseSFPackets(QByteArray &recvPacket);

    QList<QStringList> getBillTablesInfo();

    // 清除 table struct buffer 里存的解析结果信息， 当重复进行定值模板读取的时候需要清空
    void clearTalbleStructBuffer();

    QMap<QString,QString> getAboutBillGroupInfo() { return m_aboutBillGroupInfoMap; }

    //黏包数据解包为单个完整103报文
    QList<QByteArray> repairStickyFrame(QByteArray rowRecvBytes);

    //单个完整报文 apci 与 asdu 分离最小接口,并逐个解析  ，根据报文apci 68H 和固定长度的 四个ctrl ，两个addr
    void splitApciAsdu(QByteArray &packet, QByteArray &apci, QByteArray &asdu);

signals:
    void sig_parseFinished(QStringList,int);           // parser 解析完后通知table更新数据

    void sig_getTitlesFinished();                      // 当获取标题完成后，通知客户端可以进行具体组信息的获取

private:
    // 将 asdu 传递到 asdu 解析层
    QStringList parserAsdu(QByteArray &packetAsdu, int &type);

    // 功能读取全部标题中文，接写出各组标题个组号对应关系

    // 解析asdu
    SFAsduParser m_asduParser;

    /*
     * 南瑞继保103规约，在响应一个读命令的时候， 一帧报文包含多个asdu，而南自103一个读命令的响应对应一个asdu来回答
    * 需要对一帧数据分成多个asdu来给asdu解析接口，然后将多个解析结果合并到一起
    */
    //    QStringList mergeAsduParseResult(QStringList asduResult, int& type);

    /*
     * des: 按照标题名字进行分类，找出所有的定值相关组
     * para: 保护设备上的全部组的标题， 相关的关键字，默认是“定值”
     * return: 定值有关的组,pcs943：系统定值、同期定值、遥控定制、联锁定值、计量定值
     */
    QStringList getBillGroupNames(QStringList &titles, const QString key = "定值");

    QStringList getBillGroupNoes(QMap<QString,QString> &titles,  const QString &key = "定值");

    // 输入参数是包含有前半部分元素是全部组号，后半部分是全部的标题
    QMap<QString, QString> filteAboutBillGroupNamesNoes(QStringList &titles, QStringList &groupNoes, const QString key = "定值");

    QStringList m_ginNos;
    QStringList m_titleNames;

    // 保护条目组名组号信息
    QMap<QString,QString> m_aboutBillGroupInfoMap;
};

#endif // SF103_PARSER_H
